﻿using System;
using spaar.ModLoader;
using UnityEngine;

namespace Click_On_Explosion_Mod
{
    public class Click_On_Explosion_Mod : Mod
    {
        public override string Name { get { return "Click_On_Explosion_Mod"; } }//在console和别的地方使用的名称。请勿带空格。
        public override string DisplayName { get { return "Click On Explosion Mod"; } }//在Ctrl M菜单内显示的名称
        public override string BesiegeVersion { get { return "v0.32"; } }//对应游戏版本
        public override string Author { get { return "覅是x"; } }//作者
        public override Version Version { get { return new Version("1.0"); } }//版本
        public override bool CanBeUnloaded { get { return true; } }//是否能在游戏中关闭


        private GameObject temp = new GameObject();//创建母管理Game Object
        public override void OnLoad()//当加载此mod时
        {
            temp.name = "Click Explosion Mod";//为方便各位玩家调整也方便Debug最好重命名这个GameObject以使得此mod的母管理gameobject能出现在Object Explorer内
            temp.AddComponent<ClickExplosion>();//添加组件，实现点击爆炸
            GameObject.DontDestroyOnLoad(temp);//使得切换关卡时不会使得mod失效
        }

        public override void OnUnload()//当关闭此Mod时
        {
            //使Mod无效化
            GameObject.Destroy(temp.GetComponent<ClickExplosion>());//炸掉temp上的组件以阻止点击爆炸
            GameObject.Destroy(temp);//节省内存
        }


    }
    public class ClickExplosion:MonoBehaviour//一定要是MonoBehavior不然你会浑身难受
    {
        public KeyCode 使用炸弹时与鼠标单击同时需要按下的键位 = KeyCode.LeftControl;//左Ctrl键
        public KeyCode 使用炸弹时与鼠标按住同时需要按下的键位 = KeyCode.LeftShift;//左Shift键
        public int 生成类型 = 0;
        void Start()
        {
            Commands.RegisterCommand("(Example)ChangeDeployment", (args, notUses) =>//其实不需要“（Example）”
            {
                生成类型 = int.Parse(args[0]);
                switch (生成类型)
                {
                    case 0: return "Deploying Bomb";
                    case 1: return "Deploying Grenade";
                    case 2: return "Deploying Firework";
                    default:
                        生成类型 = 0;
                        return "Not Valid!";
                }

            }, "Change the deployment of explosive.");
            //我写这个就是个例子而已，请自行判断使用时机。
            //各位还可以允许用户调整爆炸力度，爆炸范围，甚至可以写点击黑洞Mod。
        }
        void Update()//每帧执行一次
        {
            if(StatMaster.isSimulating)//如果在模拟模式
            {
                if(Input.GetMouseButtonDown(0) && Input.GetKey(使用炸弹时与鼠标单击同时需要按下的键位)|| Input.GetMouseButton(0) && Input.GetKey(使用炸弹时与鼠标按住同时需要按下的键位))//得到鼠标单击与Ctrl键按下
                {
                    RaycastHit hit;//提前创建射线碰撞信息储存器
                    if (
                        Physics.Raycast(//当投射一个射线并碰撞到了一个碰撞器
                            Camera.main.ScreenPointToRay(Input.mousePosition),//方向与起点。这是默认的调用主相机的鼠标对应位置而生成的射线方向以及位置。如果使用别的射线，可以通过 Ray 射线 = new Ray(起点,方向)来自己创建一个ray。
                            out hit,//把碰撞信息输出到这个RaycastHit变量上
                            float.PositiveInfinity))//射线长度。其实正无穷不是必要的，使用相机的FarClipDistance就可以。
                    {
                        GameObject 点击时生成的物品 = (GameObject)Instantiate(//实例化一个Game Object
                            PrefabMaster.BlockPrefabs[23].gameObject,//预设列表中的第23号元素（炸弹）的Game Object 
                            hit.point,//生成位置。这里使用的是刚才投射的射线碰到碰撞器的时候的位置。
                            Camera.main.transform.rotation);//相机的朝向。
                        点击时生成的物品.GetComponent<ExplodeOnCollideBlock>().Explodey();//告诉炸弹的炸弹组件爆炸
                    }
                }
                /*if (Input.GetMouseButton(0) && Input.GetKey(使用炸弹时与鼠标按住同时需要按下的键位))//得到鼠标按下与Shift键按下
                {
                    RaycastHit hit;//提前创建射线碰撞信息储存器
                    if (
                        Physics.Raycast(//当投射一个射线并碰撞到了一个碰撞器
                            Camera.main.ScreenPointToRay(Input.mousePosition),//方向与起点。这是默认的调用主相机的鼠标对应位置而生成的射线方向以及位置。如果使用别的射线，可以通过 Ray 射线 = new Ray(起点,方向)来自己创建一个ray。
                            out hit,//把碰撞信息输出到这个RaycastHit变量上
                            float.PositiveInfinity))//射线长度。其实正无穷不是必要的，使用相机的FarClipDistance就可以。
                    {
                        GameObject 点击时生成的物品 = (GameObject)Instantiate(//实例化一个Game Object
                            PrefabMaster.BlockPrefabs[23].gameObject,//预设列表中的第23号元素（炸弹）的Game Object 
                            hit.point,//生成位置。这里使用的是刚才投射的射线碰到碰撞器的时候的位置。
                            Camera.main.transform.rotation);//相机的朝向。
                        点击时生成的物品.GetComponent<ExplodeOnCollideBlock>().Explodey();//告诉炸弹的炸弹组件爆炸
                    }
                }*/
            }
        }
    }
}
